<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
      /*   Object.defineProperty(object, propertyName, descriptor)
            defineProperty:用来定义对象构建属性的特殊状态
            object:将要添加属性的目标对象
            propertyName:对象中将要添加的属性名称
            descriptor:对象参数(描述符)，详细设置该属性在对象中的表现形式
                    value:定义属性的取值
                    writable描述该属性是否允许修改，默认false
                    enumberable描述该属性是否允许循环查找，默认false
                    configurable描述该属性是否允许可删除，默认false

                    数据劫持(拦截)操作
                    get  取值方法，无参数，需要定义返回值，劫持对象中的属性的取值行为通过返回值描述该属性的值
                    set  赋值方法，有参数，无返回值，劫持对象中属性的赋值行为，参数为属性赋值时传入的新数据
                    注意：value、writbale配置和get、set配置是不能同时定义同一个属性的配置，并且get、set方法依赖于一个外部变量为变量提供数据支持
 */
                   
        var user={
            name:"alice"
        };
        user.age=20;
        user["sex"]="女";
        console.log(user);

        //为user对象添加了hobby属性
        Object.defineProperty(user,"hobby",{
            value:"打游戏",
            writable:true,//如果是false，不允许修改属性值
            enumerable:true,//如果是false，不允许被循环遍历到
            configurable:true//如果是false，不允许被删除
        });
        user.hobby="看电影";
       

        for(let key in user){
            console.log(key);
        }
        console.log(delete user.hobby);//删除对象中的属性，有返回值，如果是true表示可以删除，如果是是false表示不能被删除
       

        var msg="嘿嘿";//全局变量
        Object.defineProperty(user,"message",{
            get(){//获取message属性的时候触发get方法
                console.log("触发了get");
                return msg;
            },
            set(value){//设置message属性值的时候触发set方法
                console.log(value);
                console.log("触发了set");
                msg=value;
            },
            enumerable:true,
            configurable:false
            
        });
        
        user.message="嘻嘻";
        console.log(user.message);
        for(let index in user){
            console.log(index);
        }
        console.log(delete user.message);
        console.log(user);

    </script>
</head>
<body>
    
</body>
</html>